@JsonManagedReference এবং @JsonBackReference এর ধারণা গাইড ও নোট

Java Technologies - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - @JsonManagedReference এবং @JsonBackReference
300

@JsonManagedReference এবং @JsonBackReference হল Jackson-এর দুইটি অ্যানোটেশন, যা Circular References (যখন একটি অবজেক্ট অন্য অবজেক্টকে রেফার করে এবং তার মধ্যে পুনরায় রেফারেন্স তৈরি হয়) নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি বিশেষত Parent-Child রিলেশনশিপের ক্ষেত্রে উপকারী, যেখানে দুটি অবজেক্ট একে অপরকে রেফার করে।


@JsonManagedReference এবং @JsonBackReference এর কাজ

  1. Circular Reference Handling:
    • Jackson-এ Circular References থাকলে, এটি JSON Serialization করার সময় অসীম লুপ তৈরি করতে পারে, যার ফলে StackOverflowError হতে পারে।
    • @JsonManagedReference এবং @JsonBackReference এই Circular Reference সমস্যা সমাধান করে, যেখানে একটি ফিল্ডকে "managed" (ব্যবস্থাপিত) হিসেবে চিহ্নিত করা হয় এবং অন্যটি "back" (পিছন থেকে) চিহ্নিত হয়।
  2. One-way Serialization:
    • @JsonManagedReference অ্যানোটেশনটি Parent অবজেক্টে ব্যবহার করা হয়, এবং @JsonBackReference অ্যানোটেশনটি Child অবজেক্টে ব্যবহার করা হয়। এইভাবে, Child অবজেক্টের রেফারেন্স Parent অবজেক্টে সিঙ্গল দিকের (one-way) Serialization-এ পরিণত হয়।

@JsonManagedReference এবং @JsonBackReference এর উদাহরণ

উদাহরণ: Parent-Child Relationship

ধরা যাক, আমাদের একটি Person ক্লাস এবং একটি Address ক্লাস আছে। Person অবজেক্টে একটি Address অবজেক্ট রয়েছে এবং Address অবজেক্ট আবার Person কে রেফার করে (bi-directional relationship)। এটি Circular Reference তৈরি করবে।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Person {
    private String name;

    @JsonManagedReference  // Parent side of the relationship
    private Address address;

    // Constructors, Getters and Setters
    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }
}

public class Address {
    private String street;

    @JsonBackReference  // Child side of the relationship
    private Person person;

    // Constructors, Getters and Setters
    public Address(String street, Person person) {
        this.street = street;
        this.person = person;
    }

    public String getStreet() {
        return street;
    }

    public Person getPerson() {
        return person;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonManagedBackReferenceExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("1234 Elm St", null);
        Person person = new Person("John", address);
        address = new Address("1234 Elm St", person);

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(person);

        System.out.println(json);
    }
}

JSON Output:

{
  "name": "John",
  "address": {
    "street": "1234 Elm St"
  }
}

ব্যাখ্যা:

  • @JsonManagedReference অ্যানোটেশনটি Person অবজেক্টে ব্যবহার করা হয়েছে, যার মাধ্যমে Address অবজেক্টের street ফিল্ড JSON আউটপুটে দৃশ্যমান হয়েছে।
  • @JsonBackReference অ্যানোটেশনটি Address অবজেক্টে ব্যবহার করা হয়েছে, যার মাধ্যমে Person রেফারেন্স JSON আউটপুটে প্রদর্শিত হয়নি।
  • Circular Reference সমস্যা এড়ানো হয়েছে, কারণ Person অবজেক্টের মধ্যে থাকা Address অবজেক্টটি ফ্ল্যাট হয়ে গেছে এবং এটি সঠিকভাবে সিরিয়ালাইজ হয়েছে।

@JsonManagedReference এবং @JsonBackReference এর সুবিধা

  1. Circular Reference থেকে মুক্তি:
    • এ দুটি অ্যানোটেশন Circular References এড়াতে সাহায্য করে, যা JSON Serialization-এর সময় StackOverflow Error থেকে রক্ষা করে।
  2. Serialization Control:
    • আপনি Control করতে পারেন কোন অবজেক্ট ফিল্ডটি JSON আউটপুটে থাকবে এবং কোনটি থাকবে না।
  3. Parent-Child Relationship:
    • Parent-Child রিলেশনশিপের ক্ষেত্রে একে অপরকে রেফার করলেও, একপক্ষের অবজেক্টের ফিল্ড JSON আউটপুটে প্রদর্শিত হয়, অন্যটি শুধুমাত্র @JsonBackReference এর মাধ্যমে ইনভিজিবল হয়ে যায়।
  4. Efficient Data Representation:
    • Nested অথবা Circular Data Representations এড়ানো হয়, যা JSON ফাইলের আকার ছোট করে এবং ডেটা ব্যবস্থাপনাকে সহজ করে তোলে।

@JsonManagedReference এবং @JsonBackReference এর সীমাবদ্ধতা

  1. Bidirectional Relationships:
    • যদি সম্পর্ক দুটি দিকে থাকে (bidirectional), তবে এগুলো কেবল একটি দিককে @JsonManagedReference এবং অন্যটি @JsonBackReference হিসেবে চিহ্নিত করতে ব্যবহৃত হয়।
  2. Complex Circular References:
    • Jackson-এ আরও জটিল Circular References থাকলে, এই অ্যানোটেশনগুলি পুরোপুরি কার্যকর নাও হতে পারে। এর জন্য @JsonIdentityInfo ব্যবহার করা যেতে পারে।
  3. Single-direction Serialization:
    • যদি আপনার প্রয়োজন হয় bidirectional Serialization এর, তবে @JsonManagedReference এবং @JsonBackReference পুরোপুরি কাজ করবে না। অন্যভাবে, আপনাকে @JsonIdentityInfo ব্যবহার করতে হতে পারে।

@JsonManagedReference এবং @JsonBackReference এর বিকল্প

  • @JsonIdentityInfo:
    • Circular Reference সমস্যা সমাধানে আরও কার্যকর একটি বিকল্প। এটি object identity এর মাধ্যমে Circular Reference পরিচালনা করতে সাহায্য করে।

@JsonIdentityInfo উদাহরণ:

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Person {
    private int id;
    private String name;

    // Constructors, Getters and Setters
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Address {
    private int id;
    private String street;
    
    // Constructors, Getters and Setters
}

  1. @JsonManagedReference এবং @JsonBackReference Jackson এর অত্যন্ত কার্যকর অ্যানোটেশন, যা Circular Reference সমস্যার সমাধান করে এবং Parent-Child সম্পর্কের জন্য একটি একপক্ষীয় Serialization নিশ্চিত করে।
  2. @JsonManagedReference Parent অবজেক্টে এবং @JsonBackReference Child অবজেক্টে ব্যবহার করতে হয়।
  3. এই অ্যানোটেশনগুলি ব্যবহার করে, আমরা Circular References এবং Bidirectional Relationships JSON ডেটাতে সহজে এবং সঠিকভাবে ম্যানেজ করতে পারি।
Content added By
Promotion

Are you sure to start over?

Loading...